package com.leecode;

import java.util.Arrays;

/**
 * 75. 颜色分类
 * <p>
 * 给定一个包含红色、白色和蓝色，一共 n 个元素的数组，原地对它们进行排序，使得相同颜色的元素相邻，并按照红色、白色、蓝色顺序排列。
 * <p>
 * 此题中，我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
 * <p>
 * 注意:
 * 不能使用代码库中的排序函数来解决这道题。
 * <p>
 * 示例:
 * <p>
 * 输入: [2,0,2,1,1,0]
 * 输出: [0,0,1,1,2,2]
 */
public class Leet75 {
	public static void main(String[] args) {
		new Leet75().sortColors(new int[]{2, 0, 2, 1, 1, 0});
	}

	/**
	 * 双指针:
	 * 若l为0,则l++;若r为2,则r--,若nums[l]>nums[r],则swap
	 * 10%,97%
	 * 100%,82%
	 * 看看Arrays.sort()的源码??
	 */
	public void sortColors(int[] nums) {
		if (nums == null || nums.length < 2) return;

		int l = 0, r = nums.length - 1;
		h:
		while (l < r) {
			if (nums[l] == 0) {
				l++;
				continue;
			}
			if (nums[r] == 2) {
				r--;
				continue;
			}

//			for(int a=l+1;a<=r;a++){
//				if(nums[a]==0){
//					swap(nums,l,a);
//					l++;
//					continue h;
//				}
//			}
//			for(int b=r-1;b>=l;b--){
//				if(nums[b]==2){
//					swap(nums,r,b);
//					r--;
//					continue h;
//				}
//			}
//			l++;
//			r--;

			int scan = l;
			while (scan <= r) {
				if (nums[scan] == 0) {
					if (scan == l) {
						scan++;
						l++;
					} else {
						swap(nums, l, scan);
						l++;
					}
				} else if (nums[scan] == 2) {
					swap(nums, r--, scan);
				} else {
					scan++;
				}
			}
			break;
		}


	}

	public void swap(int[] nums, int a, int b) {
		int temp = nums[a];
		nums[a] = nums[b];
		nums[b] = temp;
	}
}
